<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>原型替换</h1>
    <p>子类原型被替换，子类实例可以直接调用父类原型上的属性（方法），实现了对父类原型属性的继承。</p>
    <h2>缺点</h2>
    <ul>
        <li>直接定义在父类上面（父类构造方法中）的属性，子类无法使用。</li>
        <li>父类的实例，也可以访问子类的属性，继承应该是单向的，所以不可取。</li>
    </ul>
    <script>

        function Parent() {
            this.parentName = "parentName";
            this.sayParentName = function() {
                console.log("parentName:",this.parentName);
            }
        }

        // 父类原型上添加属性
        Parent.prototype.name = "奉先";

        function Child() {
            this.sex = "男";
        }

        // 把子类的原型替换为父类的原型（原型替换的继承方式）
        Child.prototype = Parent.prototype;

        // 在子类的原型上添加属性（相当于同时也在父类原型上添加）
        Child.prototype.tel = "13547811112";

        let parent = new Parent();
        console.log(parent.parentName); // parentName
        parent.sayParentName(); // 正常调用
        console.log(parent.name); // 奉先
        console.log(parent.tel); // 13547811112（子类原型上添加的属性，父类也调用到）

        console.log("---------------child-----------------")

        let child = new Child();
        console.log(child.sex); // 男
        console.log(child.parentName); // undefined
        console.log(child.name); // 奉先
        console.log(child.tel); // 男

        console.log(child instanceof Parent); // true
    </script>
</body>
</html>